package org.nf.web.servlet.param;

import cn.hutool.core.convert.Convert;
import org.nf.web.servlet.MethodArgumentResolver;

import java.util.*;

/**
 * @author wangl
 * @date 2024/3/1
 * 负责解析参数的类型转换，包括数组、集合的参数类型
 */
public abstract class AbstractMethodArgumentResolver implements MethodArgumentResolver {

    /**
     * 将请求参数转换为集合
     * 根据集合的泛型参数类型先将参数转换为相应的数组，
     * 再将数组转换为对应List、ArrayList、Set、HashSet类型的集合
     */
    protected Collection<?> toCollection(Class<?> paramType, Class<?> paramGenericType,
                                         String[] requestParams) {
        Collection<?> collection = null;
        Object[] values = toArray(paramGenericType, requestParams);
        if(values != null) {
            if(List.class.equals(paramType) || ArrayList.class.equals(paramType)) {
                collection = Convert.convert(List.class, values);
            } else if(Set.class.equals(paramType) || HashSet.class.equals(paramType)) {
                collection = Convert.convert(Set.class, values);
            }
        }
        return collection;
    }

    /**
     * 将请求参数转换为数组
     */
    protected Object[] toArray(Class<?> paramType, String[] requestParams) {
        //创建paramType类型的数组对象
        if(requestParams != null && requestParams.length > 0) {
            //创建Object[]存放转换后的值
            Object[] values = new Object[requestParams.length];
            //转换并赋值给Object[]
            for(int i=0; i<values.length; i++) {
                values[i] = toValue(paramType, requestParams[i]);
            }
            return values;
        }
        return null;
    }

    /**
     * 将请求参数转换为指定类型的值
     */
    protected Object toValue(Class<?> paramType, String requestParam) {
        return Convert.convert(paramType, requestParam);
    }
}